<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
using System;
using System.Reflection;
using System.Data;
using System.Xml;

namespace <xsl:value-of select="Root/NameSpace" />
{
	/// <summary>
	/// 数据实体基类。请勿修改此类
	/// </summary>
	public abstract class DataEntityBase
	{
		private bool _IsEmpty = true;
		private int _ReturnValue=0;

		/// <summary>
		/// 是否为空，用于在数据库中提取实体数据时使用。如果未取到数据，则为true，如果有数据，则为false。
		/// </summary>
		public bool IsEmpty
		{
			get
			{
				return _IsEmpty;
			}
			set
			{
				_IsEmpty = value;
			}
		}

		/// <summary>
		/// 返回值
		/// </summary>
		public int ReturnValue
		{
			get
			{
				return _ReturnValue;
			}
			set
			{
				_ReturnValue = value;
			}
		}

		/// <summary>
		/// 初始化元数据，使数据有初始值。
		/// 字符串的初始值为空，日期的初始值为当前日期，数字类型的为0
		/// </summary>
		protected void InitMetaData()
		{
			foreach(PropertyInfo property in this.GetType().GetProperties())
			{									
				string typeString = property.PropertyType.ToString();
				switch(typeString)
				{
					case "System.String":
						Console.WriteLine(property.Name);
						property.SetValue(this,"",null);
						break;	
					case "System.DateTime":
						property.SetValue(this,System.DateTime.Now,null);
						break;								
				}
			}
		}

		/// <summary>
		/// 本属性有两个功能
		/// 1、把数据集中的第一行数据转换为实体，如果数据集中没有数据，则IsEmpty属性为空。
		/// 2、把实体数据转换为数据集，数据集仅有一条数据。
		/// </summary>
		public DataTable MetaDataTable
		{
			get
			{
				DataTable dtResult = this.Schema;

				// 添加新行,把公共属性和公共字段的值存储
				DataRow row = dtResult.NewRow();

				foreach(DataColumn column in dtResult.Columns)
				{
					string propertyName = column.ColumnName;
					PropertyInfo property = this.GetType().GetProperty(propertyName);
					row[propertyName] = property.GetValue(this,null);
				}

				dtResult.Rows.Add(row);
				return dtResult;
			}
			set
			{
				// 要注意的是传进来的表格列的数据类型有可能和属性的数据类型不一样
				DataTable dtReceive = value;

				// 如果表格的行数为0，则表示该实体没有初始化，IsEmpty=true
				if(dtReceive.Rows.Count == 0)
				{
					this._IsEmpty = true;
					return ;
				}

				this._IsEmpty = false;

				DataTable dtResult = this.MetaDataTable;
				DataRow rowResult = dtResult.Rows[0];

				// 定位首行数据
				DataRow rowReceive= dtReceive.Rows[0];

				// 枚举实体类属性,把接受的datatable中的数据赋給根据类属性架构的datatable
				foreach(DataColumn column in dtResult.Columns)
				{
					string columnName=column.ColumnName;
					if(IsInTableColumn(dtReceive,columnName)==true)
					{
						try
						{
							rowResult[columnName]=rowReceive[columnName];
							PropertyInfo property=this.GetType().GetProperty(columnName);
							property.SetValue(this,rowResult[columnName],null);
						}
						catch(Exception ept)
						{
							throw new DataTransformException(ept.Message,ept);
						}
					}
				}
			}
		}

		/// <summary>
		/// 获取数据实体的架构
		/// </summary>
		public DataTable Schema
		{
			get
			{
				string tableName = this.GetType().Name;
				DataTable dt = new DataTable(tableName);
				foreach(PropertyInfo myPro in this.GetType().GetProperties())
				{									
					string typeString=myPro.PropertyType.ToString();

					dt.Columns.Add(myPro.Name,Type.GetType(typeString));
					dt.Columns[myPro.Name].AllowDBNull=true;
				}
				return dt;
			}
		}

		/// <summary>
		/// 判断DataTable中是否有指定名称的字段
		/// </summary>
		/// <param name="dt">要判断的DataTable</param>
		/// <param name="colName">字段名称</param>
		/// <returns>true，有；false，没有</returns>
		private bool IsInTableColumn(DataTable dt,string colName)
		{
			bool match=false;
			foreach(DataColumn col in dt.Columns)
			{
				if(col.ColumnName==colName)
				{
					match = true;
					break;
				}
			}
			return match;
		}

		/// <summary>
		/// 把实体数据保存在XML文件中
		/// </summary>
		/// <param name="fileName"></param>
		public void WriteXmlData(string fileName)
		{
			DataSet ds = new DataSet("DataEntity");
			DataTable dt=this.MetaDataTable;
			ds.Tables.Add(dt);
			ds.WriteXml(fileName,XmlWriteMode.WriteSchema);
		}

		/// <summary>
		/// 把实体数据转换为XmlDocument对象类型
		/// </summary>
		public XmlDocument XmlDom
		{
			get
			{
				DataSet ds = new DataSet("DataEntity");
				DataTable dt = this.MetaDataTable;
				ds.Tables.Add(dt);

				XmlDocument doc = new XmlDocument();
				doc.LoadXml(ds.GetXml());
				return doc;
			}
		}
	}
}
</xsl:template>
</xsl:stylesheet>